맨위로가기

자바 서블릿

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자바 서블릿은 자바를 사용하여 웹 애플리케이션을 개발하기 위한 기술이다. 1996년에 처음 발표된 이후 여러 버전으로 발전해 왔으며, 서블릿 컨테이너에서 실행된다. 서블릿은 클라이언트의 요청을 처리하고 응답을 생성하는 역할을 하며, 생명 주기 메서드를 통해 관리된다. 2000년대 초반부터 한국에서 널리 사용되었으며, 전자정부 표준프레임워크의 웹 개발 표준으로 자리 잡았다. 서블릿 3.0부터는 @WebServlet 어노테이션을 사용하여 web.xml 파일 없이 서블릿을 설정할 수 있다.

더 읽어볼만한 페이지

  • 자바 사양 요청 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
  • 자바 사양 요청 - 자바 커뮤니티 프로세스
    자바 커뮤니티 프로세스는 자바 기술 명세의 개발 및 관리를 담당하는 조직으로, 자바 기술 표준화와 발전에 기여해왔으나 운영 방식에 대한 비판과 여러 논란에 직면해 있다.
  • 자바 플랫폼, 엔터프라이즈 에디션 - IBM 웹스피어
    IBM 웹스피어는 IBM에서 출시한 기업용 소프트웨어 제품군 브랜드로, 다양한 애플리케이션 인프라, 비즈니스 프로세스 통합, 정보 통합 및 개발 도구를 포함한다.
  • 자바 플랫폼, 엔터프라이즈 에디션 - 자카르타 서버 페이지
    자카르타 서버 페이지(JSP)는 웹 애플리케이션 개발에 사용되는 서버 측 스크립팅 기술로, 서블릿으로 변환되어 실행되고 HTML 형태로 결과를 반환하며, 지시어, 스크립틀릿, 표현식, 액션 등의 문법 요소, 표현 언어(EL), JSTL을 통해 동적인 웹 페이지를 구현하고 개발 편의성을 높였다.
  • 자바 플랫폼 - 블루레이
    블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다.
  • 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
자바 서블릿 - [IT 관련 정보]에 관한 문서
기본 정보
개발자이클립스 재단
최초 출시일1996년 12월
최신 버전6.0
최신 버전 출시일2022년 5월 31일
프로그래밍 언어자바
플랫폼자카르타 EE
크기2.56 MB
장르웹 API를 위한 소프트웨어 컴포넌트
라이선스이클립스 공공 라이선스
웹사이트자카르타 서블릿
고안자파브니 디완지
일반 정보
종류자바 기술
자바 서블릿자바 플랫폼에서 동적인 웹 페이지를 만들 때 사용하는 서버 쪽 프로그램 혹은 그 사양을 의미한다.
설명웹 서버는 서블릿이 요청하는 기능을 수행하고, 그 결과를 웹 브라우저에게 전송한다.
서블릿은 자바 언어를 사용하여 개발한다.

2. 역사

자바 서블릿 API는 1996년 5월 자바원 콘퍼런스에서 처음 공개되었다.[1][3] 콘퍼런스 발표 약 2개월 후, 자바소프트 웹사이트에 최초 공개 구현체가 만들어졌다. 이것은 자바 웹 서버(Java Web Server, JWS, 코드명 ''Jeeves'')[5]의 최초 알파 버전이었으며 1997년 6월 5일 최종 제품화되었다.[6]

썬 마이크로시스템즈에서 근무하던 파브니 디완지(Pavni Diwanji)가 서블릿 1.0 사양을 개발했으며,[11][12] 1997년 6월에 버전 1.0이 완성되었다. 이후 버전 2.2부터는 자바 커뮤니티 프로세스를 통해 사양이 개발되었다.

2. 1. 서블릿 API 버전별 역사

자바 서블릿 API 역사
서블릿 API 버전발표자바 플랫폼중요한 변화
서블릿 6.02022년 5월 31일Jakarta EE 10사용 중단된 기능 제거 및 요청된 기능 개선 구현
서블릿 5.02020년 10월 9일Jakarta EE 9API가 javax.servlet영어 패키지에서 jakarta.servlet영어로 이동
서블릿 4.0.32019년 9월 10일Jakarta EE 8"Java" 상표에서 이름 변경
서블릿 4.02017년 9월JavaEE 8HTTP/2 지원
서블릿 3.12013년 5월JavaEE 7비차단 방식의 I/O, HTTP 프로토콜 업그레이드 구조
서블릿 3.02009년 12월JavaEE 6, JavaSE 6JSR 315, Ajax 대응 비동기 지원, 어노테이션에 의한 개발 편의성, web.xml 없는 개발 및 배포
서블릿 2.52005년 9월JavaEE 5 , J2SE 5.0JSR 154, J2SE 5.0 필요, 어노테이션 지원
서블릿 2.42003년 11월J2EE 1.4, J2SE 1.3JSR 154, web.xml에 XML Schema 사용
서블릿 2.32001년 8월J2EE 1.3, J2SE 1.2필터(Filter) 추가
서블릿 2.21999년 8월J2EE 1.2, J2SE 1.2J2EE의 일부가 됨, 독립적인 웹 애플리케이션(.war 파일) 도입
서블릿 2.11998년 11월미규정첫 공식 사양, RequestDispatcher, ServletContext 추가
서블릿 2.0JDK 1.1Java Servlet Development Kit 2.0의 일부
서블릿 1.01997년 6월



자바 서블릿 API는 1996년 5월 자바원 콘퍼런스에서 처음 공식 발표되었다.[16][17] 서블릿 1 사양은 썬 마이크로시스템즈에서 일하던 Pavni Diwanji가[20] 개발했으며, 1997년 6월에 1.0 버전이 완성되었다. 버전 2.2를 기점으로 이 사양은 자바 커뮤니티 프로세스를 통해 개발되었다.

3. 특징

자바 서블릿은 요청마다 새로운 프로세스를 생성하는 CGI 방식과 달리, 메모리에 상주하며 스레드를 통해 요청을 처리하므로 효율적이다.[2] 또한, 자바로 작성되어 다양한 플랫폼에서 실행할 수 있다.

서블릿 2.3부터 필터 기능이 추가되어, 서블릿 실행 전후에 처리를 삽입하는 것이 가능해졌다.

JSP는 서블릿을 자동 생성하여 동작한다. 서블릿과 JSP를 함께 사용하여 MVC 패턴을 구현하는 것이 일반적인데, 이때 서블릿은 주로 컨트롤러 역할을, JSP는 뷰(View) 역할을 담당하여 데이터 입출력 처리와 화면 표시를 분리한다.

4. 서블릿 컨테이너

웹 컨테이너(또는 서블릿 컨테이너)는 서블릿과 상호작용하는 웹 서버의 구성 요소이다.[2] 웹 컨테이너는 서블릿의 생명 주기를 관리하고, URL을 특정 서블릿에 매핑하며, URL 요청자가 올바른 접근 권한을 갖도록 하는 역할을 한다.[2]

서블릿 컨테이너는 순수하게 서블릿 처리를 수행하는 것을 지칭하며, 서블릿 컨테이너를 포함하여 JSP나 HTTP 서버로서의 기능도 포함하는 것은 웹 컨테이너라고 부르는 경향이 있다.

웹 컨테이너에는 아파치 톰캣, Jetty, JBoss, BEA WebLogic Server, IBM WebSphere Application Server, Resin 등이 있다.

5. 서블릿 생명 주기

java

import java.io.IOException;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletLifeCycleExample extends HttpServlet {

private int count;

@Override

public void init(ServletConfig config) throws ServletException {

super.init(config);

getServletContext().log("init() called");

count = 0;

}

@Override

protected void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

getServletContext().log("service() called");

count++;

response.getWriter().write("Incrementing the count: count = " + count);

}

@Override

public void destroy() {

getServletContext().log("destroy() called");

}

}



자바 서블릿 생명 주기에서 핵심적인 세 가지 메서드는 다음과 같다.


  • `init()`: 웹 컨테이너가 서블릿 인스턴스를 초기화할 때 호출한다. 이 메서드는 서블릿 생명 주기 동안 단 한 번만 호출된다. `javax.servlet.ServletConfig` 인터페이스를 구현하는 객체를 전달받아 서블릿이 웹 애플리케이션의 초기화 파라미터에 접근할 수 있게 한다.
  • `service()`: 클라이언트의 요청을 처리할 때 호출한다. 각 요청은 별도의 스레드에서 처리되며, 웹 컨테이너는 요청이 들어올 때마다 이 메서드를 호출한다. `service()` 메서드는 요청 종류를 파악하여 적절한 메서드(예: `doGet()`, `doPost()`)로 요청을 전달한다.
  • `destroy()`: 웹 컨테이너가 서블릿 인스턴스를 제거할 때 호출한다. `init()`과 마찬가지로 서블릿 생명 주기 동안 단 한 번만 호출되며, 서블릿이 사용하던 리소스를 해제하는 데 사용된다.


위의 코드는 `service()` 메서드가 호출될 때마다 카운트를 증가시켜 출력하는 간단한 서블릿 예제이다. `HttpServlet`은 `GenericServlet`의 하위 클래스로, `Servlet` 인터페이스를 구현한다. `service()` 메서드는 HTTP 요청에 따라 `doGet()`, `doPost()` 등의 메서드로 요청을 분배하지만, 위 예제에서는 `service()`를 직접 재정의하여 HTTP 요청 메서드를 구분하지 않는다.

6. 예제

다음은 `service()` 메서드가 호출된 횟수를 출력하는 간단한 서블릿 예제이다.



import java.io.IOException;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletLifeCycleExample extends HttpServlet {

private int count;

@Override

public void init(ServletConfig config) throws ServletException {

super.init(config);

getServletContext().log("init() called");

count = 0;

}

@Override

protected void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

getServletContext().log("service() called");

count++;

response.getWriter().write("Incrementing the count: count = " + count);

}

@Override

public void destroy() {

getServletContext().log("destroy() called");

}

}



서블릿은 `Servlet` 인터페이스를 구현해야 한다. 일반적으로 프로토콜에 의존하지 않는 추상 클래스인 `GenericServlet` 또는 HTTP용 하위 클래스인 `HttpServlet` 클래스를 상속하여 구현한다. 이 예제에서는 `HttpServlet` 클래스를 상속한다.

`HttpServlet` 클래스의 `service()` 메서드는 HTTP 요청에 따라 `doGet()`, `doPost()`, `doPut()`, `doDelete()` 등의 메서드로 요청을 분배한다. 위 예제에서는 `service()`가 재정의되어 어떤 HTTP 요청 메서드를 처리하는지 구분하지 않는다.

7. web.xml 정의 (서블릿 3.0 이전)

서블릿 3.0 이전에는 `web.xml` 파일을 사용하여 서블릿을 URL에 매핑하는 것이 필수적이었다.[2] `web.xml`은 웹 애플리케이션의 배포 설명자(Deployment Descriptor) 역할을 하며, 웹 컨테이너가 서블릿을 어떻게 관리하고 실행할지에 대한 정보를 담고 있다.

`web.xml`을 이용한 서블릿 설정은 서블릿 3.0 이후 버전에서도 여전히 유효하며, `@WebServlet` 어노테이션과 함께 사용될 수도 있다.

다음은 `web.xml` 파일의 버전별 기본 정의 내용이다.

Web.xml 정의
버전정의 내용
2.3
2.4
2.5
3.0
3.1


8. @WebServlet 어노테이션 (서블릿 3.0 이후)

서블릿 3.0(톰캣 7.0) 이전에는 `web.xml`을 구성하여 서블릿을 URL에 매핑해야 했지만, 서블릿 3.0 사양 이상을 사용하는 애플리케이션에서는 `@WebServlet` 어노테이션을 사용하여 서블릿을 하나 이상의 URL 패턴에 매핑할 수 있다.[1]

9. 다른 기술과의 관계

자카르타 서블릿 API는 웹 서비스를 위한 두 가지 표준 자바 기술에 의해 어느 정도 대체되었다.[2]


  • 자카르타 RESTful 웹 서비스(JAX-RS 2.0): AJAX, JSON 및 REST 서비스에 유용하다.
  • 자카르타 XML 웹 서비스(JAX-WS): SOAP 웹 서비스에 유용하다.


서블릿은 자카르타 서버 페이지(JSP)에서 자카르타 서버 페이지 컴파일러에 의해 자동으로 생성될 수 있다. 서블릿과 JSP의 차이점은 서블릿이 일반적으로 HTML을 자바 코드 안에 포함하는 반면, JSP는 자바 코드를 HTML 안에 포함한다는 것이다. 일반적으로 JSP를 사용할 때는 JSP에 자바 코드를 포함하는 것은 좋지 않은 관행으로 간주된다. 대신, 백엔드 로직을 JSP에서 `Servlet`의 자바 코드로 이동하는 것이 더 나은 방법이다. 이렇게 하면 `Servlet`이 처리만 담당하고 JSP가 HTML 표시만 담당하여 명확한 관심사 분리단일 책임 원칙을 준수할 수 있다.

서블릿을 사용하여 HTML을 직접 생성하는 방식은 드물지만, 자카르타 EE의 상위 레벨 MVC 웹 프레임워크(Faces)는 낮은 레벨의 요청/응답 처리를 위해 여전히 서블릿 기술을 명시적으로 사용한다.

다소 오래된 사용법은 서블릿을 JSP와 함께 "모델 2"라고 하는 패턴으로 사용하는 것으로, 이는 모델-뷰-컨트롤러의 한 형태이다.

Java Servlet은 서버 측 기술로 등장했다.

유사한 기술(즉, 경쟁 기술)로는 Perl 등을 사용한 CGI, PHP 프로그램의 프로세스를 Apache HTTP Server 위에서 실행할 수 있는 mod\_php 등의 모듈, 마이크로소프트가 제공하는 ASP 등이 있다. CGI가 클라이언트의 요청마다 새로운 프로세스를 기동하는 데 반해, 서블릿은 메모리에 상주하며, 요청마다 프로세스보다 가벼운 스레드를 기동하므로 효율이 좋다. 또한, 서블릿은 Java로 작성되었으므로 다양한 플랫폼에서 사용할 수 있다.

Servlet 2.3부터는 필터 기능이 추가되어, Servlet 실행 전후에 처리를 삽입하는 것이 가능해졌다.

서블릿 기술의 연장선상에 JSP가 있는데, JSP는 서블릿을 자동 생성하여 동작한다. 엄밀히 말하면 서블릿과 JSP는 다른 기술이지만, 이들은 함께 사용하는 것이 일반적이므로, JSP도 서블릿의 일부로 취급되는 경우가 많다.

참조

[1] 웹사이트 Servlet (Java(TM) EE 7 Specification APIs) https://docs.oracle.[...] 2018-07-25
[2] 웹사이트 Servlet Essentials - Chapter 1 http://www.novocode.[...]
[3] 뉴스 JavaOne conference report https://www.javaworl[...] 2018-07-25
[4] 콘퍼런스 Servers and Server Extensions 2020-02-01
[5] 뉴스 Interview: The Java Web Server team gives you the skinny https://www.javaworl[...] 2018-07-25
[6] 뉴스 Java Web Server ships! https://www.javaworl[...] 2018-07-25
[7] 웹사이트 Servlet History | community.oracle.com https://community.or[...] Weblogs.java.net 2013-06-14
[8] 콘퍼런스 Beyond Java Servlet Programming O'Reilly Media 2000-03
[9] 웹사이트 Java Web Server http://jserv.javasof[...] Sun Microsystems 2020-02-01
[10] 웹사이트 Java Web Server(tm) http://sun.com:80/so[...] Sun Microsystems 2020-02-01
[11] 웹사이트 Pavni Diwanji https://www.fosi.org[...] 2016-11-12
[12] 특허 Apparatus and method for dynamically generating information with server-side software objects
[13] 웹사이트 What's new in Servlet 3.1 ? - Java EE 7 moving forward (Arun Gupta, Miles to go ...) https://blogs.oracle[...] 2016-11-22
[14] 서적 Java Servlet Programming https://archive.org/[...] O'Reilly Media 1998-11
[15] 웹사이트 Java Servlet 3.1の新機能――クラウド対応のJava EE 7でどう変わるのか?【Java EEエキスパート・シリーズ】 https://blogs.oracle[...] オラクル 2012-08-06
[16] 뉴스 JavaOne conference report https://www.javaworl[...] 2018-07-27
[17] 콘퍼런스 Servers and Server Extensions http://java.sun.com:[...] 2020-08-20
[18] 뉴스 Interview: The Java Web Server team gives you the skinny https://www.javaworl[...] 2018-07-25
[19] 뉴스 Java Web Server ships! https://www.javaworl[...] 2018-07-25
[20] 웹인용 Pavni Diwanji https://www.fosi.org[...] 2016-11-12



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com